package com.weilx959.spt.plugin.e2sp.controller;

import com.weilx959.spt.plugin.e2sp.component.TextAreaTableCell;
import com.weilx959.spt.plugin.e2sp.model.ExcelVO;
import com.weilx959.spt.plugin.e2sp.utils.StringUtil;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.transformation.SortedList;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;

import java.util.List;
import java.util.Objects;

@Slf4j
public class ExcelSheetViewController {
    @FXML
    public StackPane rootPane;

    @FXML
    public TableView<ExcelVO.RowVO> tableView;

    public Pane getRootPane() {
        return rootPane;
    }

    @FXML
    public void initialize() {
        // initialize table view
    }

    /**
     * 设置表项
     *
     * @param headerRow 表头
     * @param rows 表项
     */
    public void setTableItems(ExcelVO.RowVO headerRow, List<ExcelVO.RowVO> rows) {
        // 清空原有数据
        tableView.getItems().clear();
        tableView.getColumns().clear();

        if (Objects.isNull(headerRow) || CollectionUtils.isEmpty(headerRow.getCells())) {
            log.error("headerRow is null or empty");
            return;
        }
        // 添加列
        for (int i = 0; i < headerRow.getCells().size(); i++) {
            String head = String.valueOf(headerRow.getCells().get(i));
            TableColumn<ExcelVO.RowVO, String> tableColumn = new TableColumn<>(head);
            // 设置样式
            tableColumn.setSortable(true);
            tableColumn.setMinWidth(50);
            tableColumn.setPrefWidth(150);
            tableColumn.setMaxWidth(5000);
            tableColumn.setResizable(true);
            tableColumn.setEditable(true);
            tableColumn.setUserData(i);

            // 设置单元格取值器
            tableColumn.setCellValueFactory(param -> {
                int index = (int)param.getTableColumn().getUserData();
                // 表格内容行数据，存在比表头少的列：size <= index
                List<Object> cells = param.getValue().getCells();

                if (cells.size() <= index) {
                    return new SimpleStringProperty("");
                }
                return new SimpleStringProperty(StringUtil.convert(cells.get(index)));
            });
            // 设置单元格编辑器
            tableColumn.setCellFactory(TextAreaTableCell.forTableColumn());
            tableColumn.setOnEditCommit(event -> event.getTableView()
                .getItems()
                .get(event.getTablePosition().getRow())
                .getCells()
                .set(
                    (int)event.getTableColumn().getUserData(),
                    event.getNewValue()
                )
            );
            tableView.getColumns().add(tableColumn);
        }
        if (CollectionUtils.isEmpty(rows)) {
            log.error("rows is null or empty");
            return;
        }
        // 有序列表
        SortedList<ExcelVO.RowVO> sortedList = new SortedList<>(FXCollections.observableList(rows));
        sortedList.comparatorProperty().bind(tableView.comparatorProperty());
        tableView.setItems(sortedList);

    }
}
